home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 140 / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan).7z / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan) (Track 1).bin / tools / dshell / dsh333bs.lzh / strsub.s < prev    next >
Text File  |  1999-07-11  |  2KB  |  137 lines

  1. *    dshell    v3
  2. *
  3. *    文字列処理
  4.  
  5.         .xdef    _dinstr
  6.         .xdef    _dinstrchr
  7.         .xdef    _dstrupr
  8.  
  9. *
  10. *    int dinstr(const uchar *base, const uchar *pat);
  11. *
  12. *    instr() の下位互換関数
  13. *    文字列 base の先頭から文字列 pat と一致する部分を探し
  14. *    その位置(1~)を返す
  15. *    一致する部分がなかった場合は 0 を返す
  16. *
  17. *    int dinstrchr(const uchar *base, char chr);
  18. *
  19. *    文字列 base の先頭から1バイト文字 chr を探し
  20. *    その位置(1~)を返す
  21. *    一致する部分がなかった場合は 0 を返す
  22. *
  23. SAVREGS        reg    d3-d4/a3
  24. SAVSIZ        set    (2+1)*4
  25.  
  26.         .offset    SAVSIZ
  27. _pc:        .ds.l    1
  28. base:        .ds.l    1
  29. pat:        .ds.b    3    *┐
  30. chr:        .ds.b    1    *┘
  31.         .text
  32. *
  33. _dinstrchr:
  34.         movem.l    SAVREGS,-(sp)
  35.         move.b    chr(sp),d2
  36.         beq    nmatch
  37.         moveq.l    #-1,d3
  38.         bra    search
  39.  
  40. _dinstr:
  41.         movem.l    SAVREGS,-(sp)
  42.  
  43.         movea.l    pat(sp),a1    *a1 = パターン
  44.         move.b    (a1)+,d2    *d2 = パターン先頭文字
  45.         beq    nmatch    *パターンが空文字列の場合は照合失敗扱い (旧版の仕様)
  46.  
  47.         movea.l    a1,a2
  48. @@:        tst.b    (a2)+
  49.         bne    @b
  50.         suba.l    a1,a2
  51.         move.w    a2,d3
  52.         subq.w    #1+1,d3        *d3 = パターン長-1のdbraカウンタ
  53.  
  54. search:        move.l    base(sp),d1    *d1 = テキスト
  55.         movea.l    d1,a0
  56. loop1:        move.b    (a0)+,d0
  57.         beq    nmatch
  58.         cmp.b    d2,d0
  59.         bne    loop1
  60.  
  61.         move.w    d3,d4
  62.         bmi    @f
  63.         movea.l    a0,a2
  64.         movea.l    a1,a3
  65. loop2:        cmpm.b    (a2)+,(a3)+
  66.         dbne    d4,loop2
  67.         bne    loop1
  68.     *仮照合完了↑
  69.  
  70.     *2バイト文字の2バイト目から始まっていないことを確認
  71. @@:        lea.l    -1(a0),a2
  72.         move.l    a2,d4
  73.         sub.l    d1,d4
  74.         bne    next3
  75.         bra    match
  76. loop3H:        swap.w    d4
  77. loop3L:        move.b    -(a2),d0
  78.         bpl    @f
  79.         cmpi.b    #$a0,d0
  80.         bcs    next3
  81.         cmpi.b    #$e0,d0
  82.         bcs    @f
  83. next3:        dbra    d4,loop3L
  84.         swap.w    d4
  85.         dbra    d4,loop3H
  86.         addq.l    #1,a2
  87. @@:        move.w    a2,d0
  88.         sub.w    a0,d0
  89.         lsr.w    #1,d0
  90.         bcs    loop1
  91.  
  92. match:        move.l    a0,d0        *見つかった
  93.         sub.l    d1,d0
  94.  
  95. retn:        movem.l    (sp)+,SAVREGS
  96.         rts
  97.  
  98. nmatch:        moveq.l    #0,d0        *見つからなかった (d0 = NULL)
  99.         bra    retn
  100.  
  101. *
  102. *    uchar *dstrupr(uchar *str)
  103. *
  104. *    X680x0 の2バイト文字を考慮した strupr()
  105. *
  106.         .offset    4
  107. str:        .ds.l    1
  108.         .text
  109. *
  110. _dstrupr:
  111.         move.l    str(sp),d0
  112.         movea.l    d0,a0
  113.         moveq.l    #$df,d2
  114.         bra    upperNext
  115. upperLoop:    bmi    @f
  116.         cmpi.b    #'a',d1
  117.         bcs    upperNext
  118.         cmpi.b    #'z',d1
  119.         bhi    upperNext
  120.         and.b    d2,-1(a0)
  121.         move.b    (a0)+,d1
  122.         bne    upperLoop
  123.         bra    upperRetn
  124. @@:        cmpi.b    #$a0,d1
  125.         bcs    @f
  126.         cmp.b    d2,d1
  127.         bls    upperNext
  128.         cmpi.b    #$f6,d1
  129.         bcc    upperNext
  130. @@:        tst.b    (a0)+
  131.         beq    upperRetn
  132. upperNext:    move.b    (a0)+,d1
  133.         bne    upperLoop
  134. upperRetn:    rts
  135.  
  136.         .end
  137.